﻿Imports Commander_Wars.Spieletools
Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX
<Serializable()> Public Class GebäudeVulkan
    Inherits ObjektGebäude
    Const Feuerbrocken As Integer = 30
    Const MaxVersuche As Integer = 9999
    Dim Ziele As Vector3() = {}

    Public Sub New(ByVal neuSpieler As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("VULKAN", neuSpieler, neuX, neuY, ObjektSpielfeld.Bodenschlacht)
        GebäudeLaden()
        getBildID(Spielfeld)
    End Sub
    Public Sub New(ByVal neuSpieler As Integer, ByVal neuLeben As Integer, ByVal neuBesetzungszahl As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Feuerzahl As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("VULKAN", neuSpieler, neuLeben, neuBesetzungszahl, neuX, neuY, Feuerzahl, ObjektSpielfeld.Bodenschlacht)
        GebäudeLaden()
        getBildID(Spielfeld)
    End Sub

    Public Sub New()
        MyBase.New("", -1, -1, -1, ObjektSpielfeld.Bodenschlacht)
        Gebäudename = "Vulkan"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 5
        Reichweite = 20
        Rechteck.Height = Hauptmenü.Feldbreite * 4
        Rechteck.Width = Hauptmenü.Feldbreite * 4
        Angriff = Angriffe.Vulkan
        Leben = -1
        Feuerbereite = -1
        Feuerladung = -1
        RotationsZenturm = New Point(Hauptmenü.Feldbreite * 3 / 2, Hauptmenü.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Verweisgebäude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {2, -2}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {-1, 0}, {1, 0}, {2, 0}, {-1, 1}, {0, 1}, {1, 1}, {2, 1}}
    End Sub

    Private Sub GebäudeLaden()
        Gebäudename = "Vulkan"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 5
        Reichweite = 20
        Rechteck.Height = Hauptmenü.Feldbreite * 4
        Rechteck.Width = Hauptmenü.Feldbreite * 4
        Angriff = Angriffe.Vulkan
        Leben = -1
        Feuerbereite = -1
        Feuerladung = -1
        RotationsZenturm = New Point(Hauptmenü.Feldbreite * 3 / 2, Hauptmenü.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Verweisgebäude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {2, -2}, {-1, -1}, {0, -1}, {1, -1}, {2, -1}, {-1, 0}, {1, 0}, {2, 0}, {-1, 1}, {0, 1}, {1, 1}, {2, 1}}
        For I = 0 To Verweisgebäude.GetLength(0) - 1
            If Not Objektverwalter.Spielfeld Is Nothing Then
                Objektverwalter.Spielfeld.Landschaften(Rechteck.X + Verweisgebäude(I, 0), Rechteck.Y + Verweisgebäude(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude = New GebäudeVerweis(Spieler, Rechteck.X, Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
            End If
        Next
    End Sub
    Public Overrides Sub Feuer(ByVal X As Integer, ByVal Y As Integer)

        'Nur der Host-Computer steuert den Vulkan
        If Hauptmenü.NetzConnected = True And Hauptmenü.NetzHosten = False Then Exit Sub
        Dim GetroffeneZiele As New Stack(Of Point)
        If Ziele.Length = 0 Then
            X = 0
            Y = 0
            Dim Zähler As Integer = 0
            Dim Ziele As Integer(,) = Kreisfunktion(Reichweite)

            Dim ZielFelder As New Stack(Of Point)
            For X = -Reichweite To Reichweite
                For Y = -Reichweite To Reichweite
                    If Ziele(X + Reichweite, Y + Reichweite) >= 0 Then
                        If Objektverwalter.Spielfeld.OnMap(Rechteck.X + X, Rechteck.Y + Y) Then
                            If X = -1 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Push(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X = 0 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Push(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X = 1 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Push(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X = 2 And Not Y = 0 And Not Y = -1 And Not Y = 1 And Not Y = 2 Then
                                ZielFelder.Push(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            ElseIf X <> 0 And X <> -1 And X <> 1 And X <> 2 Then
                                ZielFelder.Push(New Point(Rechteck.X + X, Rechteck.Y + Y))
                            End If
                        End If
                    End If
                Next
            Next
            Dim I As Integer = 1
            While I <= Feuerbrocken And ZielFelder.Count < I
                Dim Ziel As Integer = Zufallszahl(0, ZielFelder.Count - 1)
                While GetroffeneZiele.Contains(ZielFelder(Ziel))
                    Ziel = Zufallszahl(0, ZielFelder.Count - 1)
                End While
                GetroffeneZiele.Push(ZielFelder(Ziel))
                I += 1
            End While
        Else 'Wir haben ein Vorprogrammiertes Angriffsmuster.
            Dim ZahlAngriffMuster As Integer = 0
            Dim ErfassteTage() As Integer = {}
            For I = 0 To Ziele.Length - 1
                If ErfassteTage.Contains(Ziele(I).Z) = False Then
                    Array.Resize(ErfassteTage, ErfassteTage.Length + 1)
                    ErfassteTage(ErfassteTage.Length - 1) = Ziele(I).Z
                    ZahlAngriffMuster += 1
                End If
            Next
            Dim R As Integer = -1
            For I = 0 To Ziele.Length - 1
                Math.DivRem(Objektverwalter.Spielfeld.Runde - CInt(Ziele(I).Z), ZahlAngriffMuster, R)
                If R = 0 Then

                    GetroffeneZiele.Push(New Point(Ziele(I).X, Ziele(I).Y))
                End If
            Next
        End If
        BackbufferSpiel.AddAnimation("VulkanAusbruch", 10, New Point(Rechteck.X, Rechteck.Y), True, ObjektSpielfeld.Bodenschlacht)
        Dim WarteFrame As Integer = 34
        For I = 0 To GetroffeneZiele.Count - 1
            DoDamage(GetroffeneZiele(I).X, GetroffeneZiele(I).Y)
            BackbufferSpiel.AddAnimation("VulkanEinschlag", WarteFrame, GetroffeneZiele(I), True, ObjektSpielfeld.Bodenschlacht)
            WarteFrame += 3
        Next

        'Wir lassen den Vulkan bei allen Spielern Feuern
        Hauptmenü.NetzBefehlVulkanFeuer(Rechteck.X, Rechteck.Y, GetroffeneZiele.ToArray)

        Objektverwalter.Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
    End Sub
    Public Overloads Sub Feuer(ByVal GetroffeneZiele() As Point)
        BackbufferSpiel.AddAnimation("VulkanAusbruch", 10, New Point(Rechteck.X, Rechteck.Y), True, ObjektSpielfeld.Bodenschlacht)
        Dim WarteFrame As Integer = 34
        For I = 0 To GetroffeneZiele.Length - 1
            DoDamage(GetroffeneZiele(I).X, GetroffeneZiele(I).Y)
            BackbufferSpiel.AddAnimation("VulkanEinschlag", WarteFrame, GetroffeneZiele(I), True, ObjektSpielfeld.Bodenschlacht)
            WarteFrame += 3
        Next
        Objektverwalter.Spielfeld.Regeln.CheckSieg()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
    End Sub
    Public Overrides Sub FeuerradiusAnzeigen()
        KreisAnzeigen("Rot")
  MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Einheitausgewählt.wav", False)
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        M.Spielmodus = ObjektSpielMenü.Spielmodi.FeuerradiusAnzeigen
    End Sub
    Public Overrides Sub DOSpielFrame()
        'do nothing
    End Sub
    Public Overrides Function GetLandschaftsuntergrund() As String()
        Return New String() {"EBENE", "SCHNEE", "WÜSTE", "EBENE+SCHROTT"}
    End Function
    Private Function KannZielSein(ByVal X As Integer, ByVal Y As Integer, ByVal ErfassteZiele() As Point, ByVal Kreis As Integer(,)) As Boolean
        If X + Rechteck.X >= 0 And Y + Rechteck.Y >= 0 And X + Rechteck.X < Objektverwalter.Spielfeld.Breite And Y + Rechteck.Y < Objektverwalter.Spielfeld.Höhe Then
            If Kreis(X + Reichweite, Y + Reichweite) > 0 Then
                For I = 0 To ErfassteZiele.Length - 1
                    If ErfassteZiele(I).X = X And ErfassteZiele(I).Y = Y Then
                        Return False
                    End If
                Next
                Return True
            End If
        End If
        Return False
    End Function
    Public Overrides Function GetAngriffsFelder() As System.Drawing.Point()
        Return GetKreisFelder()
    End Function
End Class
